from adaptor.external import Synthesizer, Human

class Computer:
    """
    我们的应用有一个Computer类，用来显示一台计算机的基 本信息
    """
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return 'the {} computer'.format(self.name)

    def execute(self):
        """
        execute方法是计算机可以执行的主要动作。这一方法由客户端代码调用
        """
        return 'executes a program'


class Adapter:
    """
    一个通用的Adapter类，将一些带不同接口的对象适配到一个统一接口中。 __init__()方法的obj参数是我们想要适配的对象
    adapted_methods是一个字典，键值对中 的键是客户端要调用的方法
    """
    def __init__(self, obj, adapted_methods):
        self.obj = obj

        # 此方法能够更新属性和方法
        self.__dict__.update(adapted_methods)

    def __str__(self):
        return str(self.obj)

def main():
    objects = [Computer('Asus')]

    synth = Synthesizer('moog')
    # 加入execute方法
    objects.append(Adapter(synth, dict(execute=synth.play)))

    human = Human('Bob')
    # 加入execute方法
    objects.append(Adapter(human, dict(execute=human.speak)))

    for i in objects:
        print('{} {}'.format(str(i), i.execute()))

if __name__ == "__main__":
    main()
